package cn.pku.sirx.snad.ad.util;


/**
 * @author WangXiao
 */
public class EncryptUtils {

	public static String encrypt(String string) {
		return EscapeUnescape.escape(string);
	}

	public static String decrypt(String string) {
		return EscapeUnescape.unescape(string);
	}

	// private static EncryptData encryptData = new EncryptData();

}

// /**
// * @author http://thomaslee007.javaeye.com/blog/168530
// */
// class EncryptData {
// byte[] encryptKey;
// DESedeKeySpec spec;
// SecretKeyFactory keyFactory;
// SecretKey theKey;
// Cipher cipher;
// IvParameterSpec IvParameters;
//
// public EncryptData() {
// try {
// // 检测是否有 TripleDES 加密的供应程序
// // 如无，明确地安装SunJCE 供应程序
// try {
// Cipher c = Cipher.getInstance("DESede");
// } catch (Exception e) {
// System.err.println("Installling SunJCE provider.");
// Provider sunjce = new com.sun.crypto.provider.SunJCE();
// Security.addProvider(sunjce);
// }
// // 创建一个密钥
// encryptKey = "This is a test DESede Key".getBytes();
//
// // 为上一密钥创建一个指定的 DESSede key
// spec = new DESedeKeySpec(encryptKey);
//
// // 得到 DESSede keys
// keyFactory = SecretKeyFactory.getInstance("DESede");
//
// // 生成一个 DESede 密钥对象
// theKey = keyFactory.generateSecret(spec);
//
// // 创建一个 DESede 密码
// cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
//
// // 为 CBC 模式创建一个用于初始化的 vector 对象
// IvParameters = new IvParameterSpec(new byte[] { 12, 34, 56, 78, 90,
// 87, 65, 43 });
// } catch (Exception exc) {
// // 记录加密或解密操作错误
// }
// }
//
// /**
// * 加密算法
// *
// * @param password
// * 等待加密的密码
// * @return 加密以后的密码
// * @throws Exception
// */
// public byte[] encrypt(String password) {
// String encrypted_password = null;
// byte[] encrypted_pwd = null;
//
// try {
// // 以加密模式初始化密钥
// cipher.init(Cipher.ENCRYPT_MODE, theKey, IvParameters);
//
// // 加密前的密码（旧）
// byte[] plainttext = password.getBytes();
//
// // 加密密码
// encrypted_pwd = cipher.doFinal(plainttext);
//
// // 转成字符串，得到加密后的密码（新）
// encrypted_password = new String(encrypted_pwd);
// } catch (Exception ex) {
// // 记录加密错误
// }
// return encrypted_pwd;
// }
//
// /**
// * 解密算法
// *
// * @param password
// * 加过密的密码
// * @return 解密后的密码
// */
// public String decrypt(byte[] password) {
// String decrypted_password = null;
// try {
// // 以解密模式初始化密钥
// cipher.init(Cipher.DECRYPT_MODE, theKey, IvParameters);
//
// // 构造解密前的密码
// byte[] decryptedPassword = password;
//
// // 解密密码
// byte[] decrypted_pwd = cipher.doFinal(decryptedPassword);
// // 得到结果
// decrypted_password = new String(decrypted_pwd);
// } catch (Exception ex) {
// // 记录解密错误
// }
// return decrypted_password;
// }
// }

/**
 * @author http://www.pczpg.com/a/2010/0715/14723.html
 */
class EscapeUnescape {

	public static String escape(String src) {
		int i;
		char j;
		StringBuffer tmp = new StringBuffer();
		tmp.ensureCapacity(src.length() * 6);
		for (i = 0; i < src.length(); i++) {
			j = src.charAt(i);
			if (Character.isDigit(j) || Character.isLowerCase(j)
					|| Character.isUpperCase(j))
				tmp.append(j);
			else if (j < 256) {
				tmp.append("%");
				if (j < 16)
					tmp.append("0");
				tmp.append(Integer.toString(j, 16));
			} else {
				tmp.append("%u");
				tmp.append(Integer.toString(j, 16));
			}
		}
		return tmp.toString();
	}

	public static String unescape(String src) {
		StringBuffer tmp = new StringBuffer();
		tmp.ensureCapacity(src.length());
		int lastPos = 0, pos = 0;
		char ch;
		while (lastPos < src.length()) {
			pos = src.indexOf("%", lastPos);
			if (pos == lastPos) {
				if (src.charAt(pos + 1) == 'u') {
					ch = (char) Integer.parseInt(src
							.substring(pos + 2, pos + 6), 16);
					tmp.append(ch);
					lastPos = pos + 6;
				} else {
					ch = (char) Integer.parseInt(src
							.substring(pos + 1, pos + 3), 16);
					tmp.append(ch);
					lastPos = pos + 3;
				}
			} else {
				if (pos == -1) {
					tmp.append(src.substring(lastPos));
					lastPos = src.length();
				} else {
					tmp.append(src.substring(lastPos, pos));
					lastPos = pos;
				}
			}
		}
		return tmp.toString();
	}
}